package com.ftg.learn.chapter09.reflech.demo01;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author kangjx
 * @createTime 2023/1/11
 */
public class Human {

    private String humanName;

    private int humanWeight;

    public void say() {
        System.out.println("这是一个人类");
    }

    public int add(int x, int y) {
        return x + y;
    }

    /**
     * 是我们自己写的
     * @param path
     * @param methodName
     * @param sclass
     * @param b
     * @return
     */
    public Object invokeMethodOfMine(String path,String methodName,Class[] sclass,Object... b){
        try {
            //关联对象
            Class c1 = Class.forName(path);
            return invokeMethodOfMine(c1,methodName,sclass,b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *
     * @param c1
     * @param methodName
     * @param sclass
     * @param b
     * @return
     */
    public Object invokeMethodOfMine(Class c1,String methodName,Class[] sclass,Object... b){
        try {
            //实例
            Object obj = c1.newInstance();

            //方法声明  找到这个方法
            Method temp = c1.getMethod(methodName, sclass);

            //调用这个方法 value返回值
            Object value = temp.invoke(obj, b);
            return value;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {

        Human h2 = new Human();
//        Object tempVal = h2.invokeMethodOfMine("com.ftg.learn.chapter09.reflech.demo01.Human","add",int.class,int.class,2,3);
//        System.out.println(tempVal+"我是我们自己写的方法");


        Object tempVal = h2.invokeMethodOfMine(Human.class,"add",new Class[]{int.class,int.class},2,3);
        System.out.println(tempVal+"我是我们自己写的方法");


        //第一种
        String path = "com.ftg.learn.chapter09.reflech.demo01.Human";
        //第二种
        //类名.class | 基本类型.class 也可以产生这个类的 关联对象
        Class c2 = String.class;
        //第三种 实例。getClass
        String str = "abc";
        Class c3 = str.getClass();


        try {
            //关联对象
            Class c1 = Class.forName(path);

            //实例
            Object obj = c1.newInstance();

            //方法声明  找到这个方法
            Method temp = c1.getMethod("add", int.class, int.class);

            //调用这个方法 value返回值
            Object value = temp.invoke(obj, 22, 32);
            System.out.println(value);

        } catch (Exception e) {
            e.printStackTrace();
        }
//        Human h1 = new Human();
//        //没有参数
//        System.out.println(h1.add());
//        //有参数  一个 为2
//        System.out.println(h1.add(2));
//        //有参数  多个
//        System.out.println(h1.add(1, 2, 3, 4, 5, 65, 76, 7, 8, 9, 9, 8, 9, 3));
    }

    /**
     * 无穷大数相加
     * 最左匹配
     * 动态参数 ： 参数个数动态的  [0,inf]
     *
     * @param x 个数 [0,inf] 相当于数组 int[] x
     * @return
     */
    public int add(int y, int... x) {
        int[] temp = x;
        if (null == x) {
            //手工抛出异常
            throw new RuntimeException("参数不能为null");
        }
        if (x.length == 0) {
            return 0;
        }

        if (x.length == 1) {
            return x[0];
        }

        int sum = 0;
        for (int i : x) {
            sum += i;
        }

        return sum;
    }

    /**
     * 表示我这个方法上了一个同步  排它锁
     *    当有任何一个线程 （方法  实例调用这个方法test1）
     *    那么我这个类就在排它状态 （我这个类里面的其它synchronized也不让别人使用）
     *
     *   锁定的是这个类对象本身
     *
     */
    public synchronized void test1(){

    }

    public synchronized void test11() {

    }


        /**
         * 这个方法不排它
         * 多个线程都可以访问，
         *   由于这个方法没有上同步锁，所以没有锁定实例
         *   当有一个人调用test2().有人还可以访问 test3();
         */
    public  void test2(){
        Object o = new Object();
        synchronized (o){
            //这一段是我自己，我不释放你不能用
        }
    }


    public  void test3(){
        Object o = new Object();
        synchronized (o){
            //这一段是我自己，我不释放你不能用
        }
    }

    public void te1(){
        List l = new ArrayList();
        for (Object o : l) {

        }
        // Iterator
        Iterator it = l.iterator();
        while(it.hasNext()){
            it.next();
        }
    }

    /**
     * human dog cat  已经存在pojo (。。。)
     * 1 :  新建一个类模式 ， MyClassInfo (存储类的相关信息，如名称、地址)
     * 2 ： 编写一个处理类  , MyDeelClass
     *    创建静态object[] classArray 属性用来存储生成的类的实例
     *    创建方法 createClass(MyClassInfo[] ms);用来完成通过指定参数ms，创建ms对应的类的实例，存储到classArray里面.
     *    创建方法用来获得相     ddd
     */

}
